/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-11-21 13:36:34
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-11-21 21:51:18
 * @FilePath: /linux33/Dict.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// 实现一个简单的英译汉的网络字典
#pragma once
#include <iostream>
#include <string>
#include <fstream>
#include <unordered_map>
#include <unistd.h>
#include "Log.hpp"

using namespace log_ns;

const static std::string sep = ": ";

// sad: 悲伤的

class Dict
{
private:
    void LoadDict(const std::string &path)
    {
        std::ifstream in(path);
        if (!in.is_open())
        {
            LOG(FATAL, "open %s failed!\n", path.c_str());
            exit(1);
        }

        std::string line;
        while (std::getline(in, line))
        {
            LOG(DEBUG, "load info: %s , success\n", line.c_str());
            if (line.empty())
                continue;
            auto pos = line.find(sep);
            if (pos == std::string::npos)
                continue;

            std::string key = line.substr(0, pos);
            if (key.empty())
                continue;
            std::string value = line.substr(pos + sep.size());
            if (value.empty())
                continue;

            _dict.insert(std::make_pair(key, value));
        }
        LOG(INFO, "load %s done\n", path.c_str());
        in.close();
    }

public:
    Dict(const std::string &dict_path) : _dict_path(dict_path)
    {
        LoadDict(_dict_path);
    }
    std::string Translate(std::string word)
    {
        if(word.empty()) return "None";
        auto iter = _dict.find(word);
        if(iter == _dict.end()) return "None";
        else return iter->second;
    }
    ~Dict()
    {
    }

private:
    std::unordered_map<std::string, std::string> _dict;
    std::string _dict_path;
};


// const static std::string sep = ": ";
// 这里定义了一个常量 sep，它是字典文件中键值对之间的分隔符。在字典文件中，格式是 "word: translation"，即单词和翻译之间由 ": " 分

// Dict 类定义
// 私有成员 :
// _dict：一个 unordered_map 类型的成员变量，用来存储词典数据。键是单词（std::string），值是对应的翻译（std::string）。
// _dict_path：存储字典文件路径的成员变量。
// LoadDict 方法 LoadDict 方法负责从指定路径加载字典文件，并将内容解析到 _dict 成员变量中
// 打开文件：使用 std::ifstream 打开字典文件。若打开失败，记录日志并退出程序。
// 逐行读取文件：使用 std::getline 逐行读取文件内容
// 解析字典内容
//     跳过空行。
//     查找 sep（即 ": "）在行中的位置，分割单词和翻译。
//     使用 substr 提取单词（key）和翻译（value）。
//     将有效的单词-翻译对插入到 _dict 中。
// 日志记录：
// 在加载每一行时记录调试级别日志。
// 在整个字典加载完成后记录信息级别日志。
// 关闭文件：

// 公共方法
// 构造函数：在构造函数中调用 LoadDict 方法加载字典文件。
// Translate 方法：
// 该方法用于翻译给定的单词（word）。
// 如果单词为空，返回 "None"。
// 使用 unordered_map 的 find 方法查找单词。如果找不到，返回 "None"，否则返回对应的翻译
// 析构函数 : 析构函数目前没有特别的操作，因为 std::unordered_map 会自动管理内存。